#ifndef __WHIMSY_PROPERTY_BASE_HPP__SHANHAOBO_19800429__
#define __WHIMSY_PROPERTY_BASE_HPP__SHANHAOBO_19800429__

#include "./WhimsyObjectBase.hpp"
#include "./WhimsyPropertyForwardDeclare.hpp"

#include "./WhimsyPropertyVisitor.hpp"

namespace Whms
{
    namespace Property
    {
        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////

        typedef ::Wiz::DesignPattern::Visitable::Base::Type<struct ::Whms::Property::Visitor::Type> Type;
        WIZ_DECLARE(::Whms::Property::Type);

        WIZ_DECLARE_ARRAY(::Whms::Property::Ptr);
        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////

        namespace Base
        {
            template<class DataT, class DerivedT>
            struct Type : public ::Wiz::DesignPattern::Visitable::Type<DerivedT, struct ::Whms::Property::Visitor::Type>
            {
                typedef DataT           tData;
                typedef tData&          tDataRef;
                typedef tData const     tDataConst;
                typedef tDataConst&     tDataConstRef;

                tDataRef                m_DataRef;

                Type(tDataRef inDataRef) : m_DataRef(inDataRef)
                {

                }
            }; /// struct Type

            //////////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////////

            namespace Int8
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::Int8::Type, ::Whms::Property::Base::Int8::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::Int8::Type, ::Whms::Property::Base::Int8::Type> tSuper;

                    Type(::Whms::Int8::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace Int8

            namespace Int16
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::Int16::Type, ::Whms::Property::Base::Int16::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::Int16::Type, ::Whms::Property::Base::Int16::Type> tSuper;

                    Type(::Whms::Int16::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace Int16

            namespace Int32
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::Int32::Type, ::Whms::Property::Base::Int32::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::Int32::Type, ::Whms::Property::Base::Int32::Type> tSuper;

                    Type(::Whms::Int32::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace Int32

            namespace Int64
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::Int64::Type, ::Whms::Property::Base::Int64::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::Int64::Type, ::Whms::Property::Base::Int64::Type> tSuper;

                    Type(::Whms::Int64::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace Int64

            //////////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////////

            namespace UInt8
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::UInt8::Type, ::Whms::Property::Base::UInt8::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::UInt8::Type, ::Whms::Property::Base::UInt8::Type> tSuper;

                    Type(::Whms::UInt8::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace UInt8

            namespace UInt16
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::UInt16::Type, ::Whms::Property::Base::UInt16::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::UInt16::Type, ::Whms::Property::Base::UInt16::Type> tSuper;

                    Type(::Whms::UInt16::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace UInt16

            namespace UInt32
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::UInt32::Type, ::Whms::Property::Base::UInt32::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::UInt32::Type, ::Whms::Property::Base::UInt32::Type> tSuper;

                    Type(::Whms::UInt32::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace UInt32

            namespace UInt64
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::UInt64::Type, ::Whms::Property::Base::UInt64::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::UInt64::Type, ::Whms::Property::Base::UInt64::Type> tSuper;

                    Type(::Whms::UInt64::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace UInt64

            //////////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////////

            namespace Real32
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::Real32::Type, ::Whms::Property::Base::Real32::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::Real32::Type, ::Whms::Property::Base::Real32::Type> tSuper;

                    Type(::Whms::Real32::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace Real32

            namespace Real64
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::Real64::Type, ::Whms::Property::Base::Real64::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::Real64::Type, ::Whms::Property::Base::Real64::Type> tSuper;

                    Type(::Whms::Real64::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace Real64

            //////////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////////

            namespace Vec2
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::Vec2::Type, ::Whms::Property::Base::Vec2::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::Vec2::Type, ::Whms::Property::Base::Vec2::Type> tSuper;

                    Type(::Whms::Vec2::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace Vec2

            namespace Vec3
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::Vec3::Type, ::Whms::Property::Base::Vec3::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::Vec3::Type, ::Whms::Property::Base::Vec3::Type> tSuper;

                    Type(::Whms::Vec3::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace Vec3

            namespace Vec4
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::Vec4::Type, ::Whms::Property::Base::Vec4::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::Vec4::Type, ::Whms::Property::Base::Vec4::Type> tSuper;

                    Type(::Whms::Vec4::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace Vec4

            //////////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////////

            namespace IntVec2
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::IntVec2::Type, ::Whms::Property::Base::IntVec2::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::IntVec2::Type, ::Whms::Property::Base::IntVec2::Type> tSuper;

                    Type(::Whms::IntVec2::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace IntVec2

            namespace IntVec3
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::IntVec3::Type, ::Whms::Property::Base::IntVec3::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::IntVec3::Type, ::Whms::Property::Base::IntVec3::Type> tSuper;

                    Type(::Whms::IntVec3::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace IntVec3

            namespace IntVec4
            {
                struct Type : public ::Whms::Property::Base::Type<::Whms::IntVec4::Type, ::Whms::Property::Base::IntVec4::Type>
                {
                    typedef ::Whms::Property::Base::Type<::Whms::IntVec4::Type, ::Whms::Property::Base::IntVec4::Type> tSuper;

                    Type(::Whms::IntVec4::Ref inDataRef) : tSuper(inDataRef)
                    {
                    }
                };
            } /// end of namespace IntVec4

            //////////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////////

        } /// end of namespace Base
    } /// end of namespace Property
} /// end of namespace Whms

#endif /*__WHIMSY_PROPERTY_BASE_HPP__SHANHAOBO_19800429__*/
